package com.zmkj.cn.comm.util;

import com.google.common.collect.Lists;
import com.zmkj.cn.comm.exception.BaseException;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 排班算法
 * @author 伍绍宇 Coy
 * @date 2021年4月10日 10:43:36
 */
public class SchedulingUtil {
    /**
     * 算法包
     */
    public static <E> void packGroup(E[] input, E[] output, int index, int start, List<List<E>> temp) {
        if (index == output.length) {
            temp.add(Lists.newArrayList(output));
        } else {
            for (int i = start; i < input.length; i++) {
                output[index] = input[i];
                packGroup(input, output, index + 1, i + 1, temp);
            }
        }
    }

    /**
     * @param input 需要组合的集合
     * @param size 每组数量
     *
     */
    public static List<List<String>> getRuleList(String[] input, int size) {
        if (input == null || input.length == 0 || size <= 0) {
            throw new BaseException("参数异常");
        }
        String[] output = new String[size];
        List<List<String>> temp = new ArrayList<List<String>>();
        // 组合
        packGroup(input, output, 0, 0, temp);
        // 重构顺序，保证一人不连续值班超过两天
        List<List<String>> endTemp = new ArrayList<>();
        for (int i = 0; i < temp.size() / 2; i++) {
            endTemp.add(temp.get(i));
            endTemp.add(temp.get(temp.size() - i -1));
        }
        // 奇数会多出一个，直接拼接在末尾
        if (temp.size() % 2 > 0){
            endTemp.add(temp.get(temp.size() / 2));
        }
        return endTemp;
    }

    public static List<String> getRuleByIndex(String[] input, int size, int index) {
        List<List<String>> ruleList = getRuleList(input, size);
        return ruleList.get(index % ruleList.size());
    }

    public static List<String> getRuleByIndex(String[] input, int size, int days, int index) {
        if ( size <= 0 || days <= 0 || index < 0) {
            throw new BaseException("参数不能为0或负数");
        }
        if ( input == null || size > input.length) {
            throw new BaseException("参数异常");
        }
        if (input.length == 1) {
            // 如果集合内只有一个用户
            return Arrays.asList(input);
        }
        List<List<String>> ruleList = getRuleList(input, size);
        return ruleList.get(index / days % ruleList.size());
    }
}
